<html>
    <head>
        <title>使用 [RequireFeature]特性检查功能</title>
    </head>
    <body>
       <script>
            /*
                 1、使用[RequiredFeature] 特性进行功能检查

                                                [RequiredFeature] 特性 （在Volo.Abp.Features命名空间中定义）用于以声明方式检查功能是否为true（已启用）。

                                                它是 boolean 功能的有用的快捷方式。

                                                eg：  检查是否启用了"PDF" 报告功能

                                                        public class ReportingAppService : ApplicationService, IReportingAppService
                                                        {
                                                            [RequiresFeature("MyApp.PdfReporting")]  // 检查是否启用了"PDF" 报告功能
                                                            public async Task<PdfReportResultDto> GetPdfReportAsync()  // 拦截系统只拦截 异步方法！！
                                                            {
                                                                //TODO...
                                                            }
                                                        }


                                                RequiresFeature(...)只需获取一个功能名称来检查它是否已启用。如果未启用，则抛出"授权异常"并向客户端返回正确的响应。

                                                RequiresFeature可以获得多个功能名称，如 [RequiresFeature("Feature1", "Feature2")]。  在这种情况下，ABP检查是否启用了要求的所有功能。
                                                使用RequiresAll选项，如[RequiresFeature("Feature1", "Feature2", RequiresAll = true)]强制检查所有要启用的功能。

                                                方法或类支持多次使用 [RequiresFeature]属性。在这种情况下，ABP会检查所有这些。

                                            
                                                ★、功能名称可以是任意字符串。对于一个功能来说，它应该是唯一的。

                                                ★、关于拦截系统

                                                        ABP使用拦截系统来是 [RequiresFeature]属性工作。因此，它可以与从一来注入的任何类(应用程序服务、控制器)一起使用。

                                                        但是，需要遵循一些规则才能使其工作：

                                                                ①、 如果你没有通过接口注入服务(如，IMyService)，则服务的方法必须是virtual。否则，动态代理/拦截系统无法工作。

                                                                ②、仅拦截 async 方法

                                                (控制器 和 Razor页面方法有一个例外。它们不需要遵循上述规则，因为ABP在这种情况下使用操作/页面过滤器来实现功能检查。)
            */
       </script>
    </body>
</html>